package com.ruoyi.system.service.impl;

import com.ruoyi.common.support.Convert;
import com.ruoyi.system.domain.ZhGameArea;
import com.ruoyi.system.mapper.ZhGameAreaMapper;
import com.ruoyi.system.service.IZhGameAreaService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.Comparator;
import java.util.LinkedList;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 游戏区服 服务层实现
 *
 * @author ruoyi
 */
@Service
@Transactional(rollbackFor = Exception.class)
public class ZhGameAreaServiceImpl implements IZhGameAreaService {
    @Autowired
    private ZhGameAreaMapper zhGameAreaMapper;

    /**
     * 查询游戏区服信息
     *
     * @param id 游戏区服ID
     * @return 游戏区服信息
     */
    @Override
    public ZhGameArea selectZhGameAreaById(Integer id) {
        return zhGameAreaMapper.selectZhGameAreaById(id);
    }

    /**
     * 查询游戏区服列表
     *
     * @param zhGameArea 游戏区服信息
     * @return 游戏区服集合
     */
    @Override
    public List<ZhGameArea> selectZhGameAreaList(ZhGameArea zhGameArea) {
        return zhGameAreaMapper.selectZhGameAreaList(zhGameArea);
    }

    /**
     * 新增游戏区服
     *
     * @param zhGameArea 游戏区服信息
     * @return 结果
     */
    @Override
    public int insertZhGameArea(ZhGameArea zhGameArea) {
        return zhGameAreaMapper.insertZhGameArea(zhGameArea);
    }

    /**
     * 修改游戏区服
     *
     * @param zhGameArea 游戏区服信息
     * @return 结果
     */
    @Override
    public int updateZhGameArea(ZhGameArea zhGameArea) {
        return zhGameAreaMapper.updateZhGameArea(zhGameArea);
    }

    /**
     * 删除游戏区服对象
     *
     * @param ids 需要删除的数据ID
     * @return 结果
     */
    @Override
    public int deleteZhGameAreaByIds(String ids) {
        return zhGameAreaMapper.deleteZhGameAreaByIds(Convert.toStrArray(ids));
    }


    @Override
    public List selectTree(ZhGameArea zhGameArea) {
        List<ZhGameArea> parentZhGameAreaList = new LinkedList<>();
        // 查出所有游戏区服
        List<ZhGameArea> zhGameAreas = selectZhGameAreaList(zhGameArea);
        // 筛选所有父节点,即判断父id是否为0
        int parentId;
        for (ZhGameArea gameArea : zhGameAreas) {
            Integer gameAreaParentId = gameArea.getParentId();
            parentId = gameAreaParentId != null ? gameAreaParentId : 0;
            // 为父节点
            if(parentId==0){
                // 寻找子节点
                List<ZhGameArea> children = findChildren(gameArea.getId(), zhGameAreas);
                gameArea.setChildren(children);
                parentZhGameAreaList.add(gameArea);
            }
        }

        return parentZhGameAreaList;
    }

    /**
     * 查询游戏根区服列表
     *
     * @param zhGameArea 游戏区服信息
     * @return 游戏根区服集合
     */
    @Override
    public List<ZhGameArea> selectRootZhGameAreaList(ZhGameArea zhGameArea) {
        return zhGameAreaMapper.selectRootZhGameAreaList(zhGameArea);
    }

    /**
     * 寻找所有parentId 为parentId 的元素
     * @param parentId  parentId
     * @param list 游戏区服数据
     * @return
     */
    private List<ZhGameArea> findChildren(int parentId,List<ZhGameArea> list){
        return list.stream().parallel().filter(item-> item.getParentId()==parentId).sorted(Comparator.comparingInt(ZhGameArea::getSorting)).collect(Collectors.toList());
    }
}
